﻿using CsvHelper;
using CsvHelper.Configuration;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Shapes;

namespace DeHeng_Mes.Utils
{
    public class CsvUtils
    {

        /// <summary>
        /// 遍历指定路径下的所有文件夹，查找后缀名为 .csv 的文件，并将路径添加到列表中
        /// </summary>
        /// <param name="rootPath">要遍历的根文件夹路径</param>
        /// <returns>找到的 CSV 文件路径列表</returns>
        public static List<string> FindCsvFiles(string rootPath)
        {
            List<string> csvFilePaths = new List<string>();

            try
            {
                if (!Directory.Exists(rootPath))
                {
                    return csvFilePaths;
                }

                // 获取指定路径下的所有 .csv 文件
                string[] csvFiles = Directory.GetFiles(rootPath, "*.csv", SearchOption.TopDirectoryOnly);

                foreach (string file in csvFiles)
                {
                    csvFilePaths.Add(file); // 将文件路径添加到列表
                }
            }
            catch (Exception ex)
            {
                Tools.ProduceLogTextError($"查找 CSV 文件失败, 错误信息: {ex.Message}");
                return csvFilePaths;
            }

            return csvFilePaths; // 返回找到的文件路径列表
        }

        /// <summary>
        /// 读取 CSV 文件并返回数据列表
        /// </summary>
        /// <typeparam name="T">要映射到的类型</typeparam>
        /// <param name="filePath">CSV 文件路径</param>
        /// <returns>返回映射后的对象列表</returns>
        public static List<T> ReadCsvFile<T>(string filePath = "", string delimiter = ",", bool useHeader = true)
        {
            List<T> records = new List<T>();

            var config = new CsvConfiguration(CultureInfo.InvariantCulture)
            {
                Delimiter = delimiter, // 设置分隔符
                HasHeaderRecord = useHeader,// 根据参数设置是否读取列名
            };

            using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
            using (StreamReader reader = new StreamReader(fileStream, Encoding.GetEncoding("GB2312")))
            using (var csv = new CsvReader(reader, config))
            {
                // 根据 HasHeaderRecord 的值决定是否使用标题行
                if (!useHeader)
                {
                    csv.Read();
                }

                records = csv.GetRecords<T>().ToList();
            }

            return records;
        }
    }
}
